package main

import (
	"fmt"
)

// recover 仅在延迟函数 defer 中有效，
// 在正常的执行过程中，调用 recover 会返回 nil 并且没有其他任何效果，
// 如果当前的 goroutine 陷入恐慌，调用 recover 可以捕获到 panic 的输入值，并且恢复正常的执行
// panic 和 recover一起用，捕获异常处理
func tryRecover() {
	defer func() {
		r := recover() //仅在defer代码段调用中使用,类比try  catch
		if r == nil {
			fmt.Println("Nothing to recover. " +
				"Please try uncomment errors " +
				"below.")
			return
		}
		if err, ok := r.(error); ok {
			fmt.Println("Error occurred:", err)
		} else {
			panic(fmt.Sprintf(
				"I don't know what to do: %v", r))
		}
	}()

	// Uncomment each block to see different panic
	// scenarios.
	// Normal error
	//panic(errors.New("this is an error"))

	// Division by zero
	//b := 0
	//a := 5 / b
	//fmt.Println(a)

	// Causes re-panic
	//panic(123)
}

func main() {
	tryRecover()
}
